/// ===========================================================================
/// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
/// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
/// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
/// PURPOSE.
/// ===========================================================================
/// 
/// Project:        MOSS Usage Tools
/// Authors:        Leonid Lyublinski (leonidly@microsoft.com)
///                 Rita Zhang (ritazh@microsoft.com)
/// Company:        Microsoft Services
/// Date:           05/04/2008  
/// Version:        1.0
/// Comment:        To be used for future releases
/// ===========================================================================

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Diagnostics;
using System.Collections;
using System.Runtime.InteropServices;
using ActiveDs;

namespace Microsoft.SharePoint.Administration.UsageSettings.Common
{
    public class Utility
    {
        public static void UpdateDSN(string dsnPath, string folderPath)
        {
            try
            {
                //StreamReader reader = new StreamReader(dsnPath);
                //string content = reader.ReadToEnd();
                //content = content.Replace("<FOLDER_PATH>", folderPath);
                //reader.Close();

                StreamWriter writer = new StreamWriter(dsnPath);
                writer.Write(Resource.DsnMSAccessTxt);
                writer.Write(folderPath);
                writer.Close();
            }
            catch (Exception ex)
            {

            }
        }

        public void CreateShare(string folderPath)
        {

        }
    }



    internal class NetApi32
    {
        public enum NetError
        {
            NERR_Success = 0,
            NERR_BASE = 2100,
            NERR_UnknownDevDir = (NERR_BASE + 16),
            NERR_DuplicateShare = (NERR_BASE + 18),
            NERR_BufTooSmall = (NERR_BASE + 23),
        }

        public enum SHARE_TYPE : ulong
        {
            STYPE_DISKTREE = 0,
            STYPE_PRINTQ = 1,
            STYPE_DEVICE = 2,
            STYPE_IPC = 3,
            STYPE_SPECIAL = 0x80000000,
        }

        [StructLayout( LayoutKind.Sequential )]
        public struct SHARE_INFO_502
        {
            [MarshalAs(UnmanagedType.LPWStr)]
            public string shi502_netname;
            public uint shi502_type;
            [MarshalAs(UnmanagedType.LPWStr)]
            public string shi502_remark;
            public Int32 shi502_permissions;
            public Int32 shi502_max_uses;
            public Int32 shi502_current_uses;
            [MarshalAs(UnmanagedType.LPWStr)]
            public string shi502_path;
            public IntPtr shi502_passwd;
            public Int32 shi502_reserved;
            public IntPtr shi502_security_descriptor;
        }

        [DllImport("Netapi32.dll")]
        public static extern int NetShareAdd(
                [MarshalAs(UnmanagedType.LPWStr)]
        string strServer, Int32 dwLevel, IntPtr buf, IntPtr parm_err);


    }
    
    internal class AD_ShareUtil
    {
        NetApi32.NetError CreateShare(string strServer,
                                      string strPath,
                                      string strShareName,
                                      string strShareDesc,
                                      bool bAdmin)
        {
            NetApi32.SHARE_INFO_502 shInfo = 
                  new NetApi32.SHARE_INFO_502();
            shInfo.shi502_netname = strShareName;
            shInfo.shi502_type = 
                (uint)NetApi32.SHARE_TYPE.STYPE_DISKTREE;
            if (bAdmin)
            {
                shInfo.shi502_type = 
                    (uint)NetApi32.SHARE_TYPE.STYPE_SPECIAL;
                shInfo.shi502_netname += "$";
            }
            shInfo.shi502_permissions = 0;
            shInfo.shi502_path = strPath;
            shInfo.shi502_passwd = IntPtr.Zero;
            shInfo.shi502_remark = strShareDesc;
            shInfo.shi502_max_uses = -1;
            shInfo.shi502_security_descriptor = IntPtr.Zero;

            string strTargetServer = strServer;
            if (strServer.Length != 0)
            {
                strTargetServer = strServer;
                if (strServer[0] != '\\')
                {
                    strTargetServer = "\\\\" + strServer;
                }
            }
            int nRetValue = 0;
            // Call Net API to add the share..
            int nStSize = Marshal.SizeOf(shInfo);
            IntPtr buffer = Marshal.AllocCoTaskMem(nStSize);
            Marshal.StructureToPtr(shInfo, buffer, false);
            nRetValue = NetApi32.NetShareAdd(strTargetServer, 502, 
                    buffer, IntPtr.Zero);
            Marshal.FreeCoTaskMem( buffer );

            return (NetApi32.NetError)nRetValue;
        }
    }
}          